package bean;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

import org.richfaces.component.UISelect;

import DAO.ExameDAO;
import DAO.HemodialiseDAO;
import DAO.PacienteDAO;
import Model.Exame;
import Model.Hemodialise;
import Model.Paciente;
import Model.Usuario;
import Utils.Uteis;

public class HemodialiseBean {
	
	private int id;
	private Date dataSessao;	
	private String horaInicio;
	private String horaFim;
	private String minutosInicio;
	private double pesoPos;
	private double pesoPre;
	private String responsavel;
	private String observacao;	
	private int idPaciente;
	private int idUsuario;
	
	private UIInput pesoInicial;
	private UISelect idPacienteValidation;
	
	public UISelect getIdPacienteValidation() {
		return idPacienteValidation;
	}



	public void setIdPacienteValidation(UISelect idPacienteValidation) {
		this.idPacienteValidation = idPacienteValidation;
	}



	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}



	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}



	/**
	 * @return the dataCadastro
	 */
	public Date getDataSessao() {
		return dataSessao;
	}



	/**
	 * @param dataCadastro the dataCadastro to set
	 */
	public void setDataSessao(Date dataCadastro) {
		this.dataSessao = dataCadastro;
	}



	/**
	 * @return the horaInicio
	 */
	public String getHoraInicio() {
		return horaInicio;
	}



	/**
	 * @param horaInicio the horaInicio to set
	 */
	public void setHoraInicio(String horaInicio) {
		this.horaInicio = horaInicio;
	}



	/**
	 * @return the horaFim
	 */
	public String getHoraFim() {
		return horaFim;
	}


	/**
	 * @param horaFim the horaFim to set
	 */
	public void setHoraFim(String horaFim) {
		this.horaFim = horaFim;
	}


	/**
	 * @return the peso_pre
	 */
	public double getPesoPre() {
		return pesoPre;
	}


	/**
	 * @param peso_pre the peso_pre to set
	 */
	public void setPesoPre(double peso_pre) {
		this.pesoPre = peso_pre;
	}



	/**
	 * @return the peso_pos
	 */
	public double getPesoPos() {
		return pesoPos;
	}



	/**
	 * @param peso_pos the peso_pos to set
	 */
	public void setPesoPos(double peso_pos) {
		this.pesoPos = peso_pos;
	}



	/**
	 * @return the responsavel
	 */
	public String getResponsavel() {
		return responsavel;
	}



	/**
	 * @param responsavel the responsavel to set
	 */
	public void setResponsavel(String responsavel) {
		this.responsavel = responsavel;
	}



	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}



	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}


	/**
	 * @return the idPaciente
	 */
	public int getIdPaciente() {
		return idPaciente;
	}


	/**
	 * @param idPaciente the idPaciente to set
	 */
	public void setIdPaciente(int idPaciente) {
		this.idPaciente = idPaciente;
	}


	/**
	 * @return the idUsuario
	 */
	public int getIdUsuario() {
		return idUsuario;
	}


	/**
	 * @param idUsuario the idUsuario to set
	 */
	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}
	
	/**
	 * @return the minutosInicio
	 */
	public String getMinutosInicio() {
		return minutosInicio;
	}
	/**
	 * @param minutosInicio the minutosInicio to set
	 */
	public void setMinutosInicio(String minutosInicio) {
		this.minutosInicio = minutosInicio;
	}

	private String minutosFim;
	/**
	 * @return the minutosFim
	 */
	public String getMinutosFim() {
		return minutosFim;
	}

	/**
	 * @param minutosFim the minutosFim to set
	 */
	public void setMinutosFim(String minutosFim) {
		this.minutosFim = minutosFim;
	}	


	public void setPesoInicial(UIInput pesoInicial) {
		this.pesoInicial = pesoInicial;
	}

	public UIInput getPesoInicial() {
		return pesoInicial;
	}

	public String Salvar()
	{
		try
		{			
			String horainicio_formatada = this.horaInicio + ":" + this.minutosInicio;
			String horafim_formatada = this.horaFim + ":" + this.minutosFim;
			
			java.sql.Date _dataSesao = Uteis.javaDate2SqlDate(this.dataSessao);			
			java.sql.Time _horaInicio = Uteis.javaString2SqlTime(horainicio_formatada); 
			java.sql.Time _horaFim = Uteis.javaString2SqlTime(horafim_formatada);
			Usuario objUsuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("currentUser");
			
			Hemodialise hemodialise = new Hemodialise();
			hemodialise.setDataSessao(_dataSesao);
			hemodialise.setHoraInicio(_horaInicio);
			hemodialise.setHoraFim(_horaFim);
			hemodialise.setPesoPre(this.pesoPre);
			hemodialise.setPesoPos(this.pesoPos);
			hemodialise.setResponsavel(this.responsavel);
			hemodialise.setObservacao(this.observacao);
			hemodialise.setIdUsuario(objUsuario.getIdUsuario());
			hemodialise.setIdPaciente(this.idPaciente);
			
			if(this.id > 0)
			{
				hemodialise.setIdHemodialise(this.id);
				HemodialiseDAO.Update(hemodialise);
			}
			else
			{
				HemodialiseDAO.Insert(hemodialise);				
			}		
		    
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Salvas com sucesso"));			
			
		}
		catch(ParseException pexc)
		{
			pexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}		
		catch(SQLException sexc)
		{
			sexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}	
		
		return "hemodialise_list";
	}
	
	
	public String Editar()
	{
		
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		int id =  Integer.parseInt(request.getParameter("idsessao"));
		Hemodialise hemodialise = null;
		
		try
		{
			hemodialise = HemodialiseDAO.LoadObject(id); 
			  
			if(hemodialise != null)
			{
				String arrHoraInicio[] = hemodialise.getHoraInicio().toString().split(":");
				String arrHoraFim[] = hemodialise.getHoraFim().toString().split(":");
				
				this.setId(hemodialise.getIdHemodialise());
				this.setDataSessao(hemodialise.getDataSessao());
				
				this.setHoraInicio(arrHoraInicio[0]);
				this.setMinutosInicio(arrHoraInicio[1]);
				
				this.setHoraFim(arrHoraFim[0]);
				this.setMinutosFim(arrHoraFim[1]);
				
				this.setPesoPre(hemodialise.getPesoPre());
				this.setPesoPos(hemodialise.getPesoPos());
				this.setResponsavel(hemodialise.getResponsavel());
				this.setObservacao(hemodialise.getObservacao());
				this.setIdUsuario(hemodialise.getIdUsuario());
				this.setIdPaciente(hemodialise.getIdPaciente());
				
				return "hemodialise_edit";
			}
			else
			{
				return "hemodialise_list";
			}
		
		}
		catch(Exception ex)
		{
			ex.printStackTrace();			
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao listar as informações, contate o administrador do sistema"));
			return "hemodialise_list";
		}
	}
	
	public String Inativar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		int id =  Integer.parseInt(request.getParameter("idsessao"));
		try
		{
			HemodialiseDAO.InativarSessao(id);
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações apagadas com sucesso"));
		}
		catch(SQLException ex)
		{
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao realizar a transação, contate o administrador do sistema"));	
		}
		
		return "hemodialise_list";
	}
	
	public void validaLimitePeso(FacesContext context, UIComponent uicomponent, Object value)
	{
		double pesoFinal = Double.parseDouble(value.toString());
		double pesoInicial = Double.parseDouble(this.pesoInicial.getLocalValue().toString());
		double diferenca = pesoInicial - pesoFinal;		
		
		if(! (pesoFinal > pesoInicial))
		{
			if(diferenca >= 5)
			{
				((UIInput)uicomponent).setValid(false);
				FacesMessage message = new FacesMessage();
				message.setDetail("A perda de peso não pode ser maior que 5Kg");        
				message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
				throw new ValidatorException(message);
			}			
		}
		else
		{
			((UIInput)uicomponent).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("A peso final não pode ser maior que o peso inicial!");        
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);			
		}
	}
	
	public void validateData(FacesContext context, UIComponent uicomponent, Object value)
	{
		Date dataSel = (Date) value;

		try {
			if(dataSel.after(new Date()))
			{
				((UIInput)uicomponent).setValid(false);
				FacesMessage message = new FacesMessage();
				message.setDetail("A data não pode estar no futuro!");        	
				message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
				throw new ValidatorException(message);
			}	
			else
			{	
				int idPaciente = Integer.parseInt(this.idPacienteValidation.getLocalValue().toString());
				Paciente paciente = PacienteDAO.LoadObject(idPaciente);
				if(dataSel.before(paciente.getDataNascimento()))
				{
					String data = Uteis.formatarData(paciente.getDataNascimento());
					((UIInput)uicomponent).setValid(false);
					FacesMessage message = new FacesMessage();					
					message.setDetail("A data não pode ser menor que "+ data +" que é data de nascimento do paciente! ");
					message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
					throw new ValidatorException(message);
				}
			}	
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}
	